﻿/** 自制的模式管理模块,管理一个模式组[],并绑定一个变化热键.
  传入一个组之后就可以设置模式,循环变化模式(MyMode_next()函数),获取当前模式的index和名称
  但index从1开始,AutoHotkey的规则如此没办法.
*/

/** 全局变量 
*/
global __MyMode_index := 1 ;模式index
global __MyMode_name := "" ;模式名称
;下面的变量需要用MyMode_setup设置
global __MyMode_nameList := [] ;模式名称表,需要用MyMode_setup函数设定
global __MyMode_exeTitle := "" ;指定热键的exe
global __MyMode_hotkey := "" ;绑定的热键,按键则执行MyMode_next()函数变换模式
global __MyMode_guiName := "" ;如果要在模式变化时在gui显示,就需要指定gui的名称,如果是空的就是主gui
global __MyMode_guiVarName := "" ;指定gui绑定变量名称,不指定(空)则不会执行显示模式名字的指令

/** 导出函数
*/

;初始化设定
MyMode_setup(nameList, exeTitle, hotkey1, guiName := "", guiVarName := ""){
  local title := "ahk_exe " . exeTitle
  ;初始化数据
  __MyMode_index := 1
  __MyMode_nameList := nameList
  __MyMode_exeTitle := exeTitle
  __MyMode_hotkey := hotkey1
  __MyMode_name := __MyMode_nameList[1]
  __MyMode_guiName := guiName
  __MyMode_guiVarName := guiVarName
  ;绑定热键
  Hotkey, IfWinActive, %title%
  Hotkey, ~%__MyMode_hotkey%, MyMode_next
  Hotkey, IfWinActive
}

MyMode_setIndex(i){
  local newIndex 
  ;计算并设定新的index,同时处理传入参数i超出数组范围的情况
  newIndex := Mod(i, __MyMode_nameList.Count())
  if (newIndex == 0) {
    newIndex := __MyMode_nameList.Count()
  }
  __MyMode_index := newIndex
  __MyMode_name := __MyMode_nameList[__MyMode_index]
  ;在gui显示模式名称
  if (__MyMode_guiVarName) {
    if (__MyMode_guiName) {
      GuiControl, %__MyMode_guiName%:Text, %__MyMode_guiVarName%, %__MyMode_name%
    } else {
      GuiControl, Text, %__MyMode_guiVarName%, %__MyMode_name%
    }
  }
}

MyMode_getIndex(){
  return __MyMode_index
}

MyMode_getName(){
    return __MyMode_name
  }

MyMode_next(){
  MyMode_setIndex(__MyMode_index+1)
  ;MsgBox, % MyMode_getName()
}

/** 测试 
*/
;MyMode_setup(["关羽", "张飞", "赵云", "黄忠", "马超", "魔法张飞", "诸葛亮", "张辽", "貂蝉", "白甲黄忠"], "fbas.exe")
